import {message} from 'ant-design-vue'
import request, {IListWorkspaceResponse, IPage, IWorkspaceResponse} from '/@/api/http/request'
import {OutOfControlAction, TaskStatus, TaskType} from '/@/types/task'
import {WaylineType} from '/@/types/wayline'

const HTTP_PREFIX = '/wayline/api/v1'

// Get Wayline Files
export const getWaylineFiles = async function (wid: string, body: {}): Promise<IWorkspaceResponse<any>> {
    const url = `${HTTP_PREFIX}/workspaces/${wid}/waylines?order_by=${body.order_by}&page=${body.page}&page_size=${body.page_size}`
    const result = await request.get(url)
    return result.data
}

// Download Wayline File
export const downloadWaylineFile = async function (workspaceId: string, waylineId: string): Promise<any> {
    const url = `${HTTP_PREFIX}/workspaces/${workspaceId}/waylines/${waylineId}/url`
    const result = await request.get(url, {responseType: 'blob'})
    if (result.data.type === 'application/json') {
        const reader = new FileReader()
        reader.onload = function (e) {
            const text = reader.result as string
            const result = JSON.parse(text)
            message.error(result.message)
        }
        reader.readAsText(result.data, 'utf-8')
    } else {
        return result.data
    }
}

// Delete Wayline File
export const deleteWaylineFile = async function (workspaceId: string, waylineId: string): Promise<IWorkspaceResponse<any>> {
    const url = `${HTTP_PREFIX}/workspaces/${workspaceId}/waylines/${waylineId}`
    const result = await request.delete(url)
    return result.data
}

export interface CreatePlan {
    name: string,
    file_id: string,
    dock_sn: string,
    task_type: TaskType, // 任务类型
    wayline_type: WaylineType, // 航线类型
    task_days: number[] // 执行任务的日期（秒）
    task_periods: number[][] // 执行任务的时间点（秒）
    rth_altitude: number // 相对机场返航高度 20 - 500
    out_of_control_action: OutOfControlAction // 失控动作
    min_battery_capacity?: number, // The minimum battery capacity of aircraft.
    min_storage_capacity?: number, // The minimum storage capacity of dock and aircraft.
}

// Create Wayline Job
export const createPlan = async function (workspaceId: string, plan: CreatePlan): Promise<IWorkspaceResponse<any>> {
    const url = `${HTTP_PREFIX}/workspaces/${workspaceId}/flight-tasks`
    const result = await request.post(url, plan)
    return result.data
}

export interface Task {
    job_id: string,
    job_name: string,
    task_type: TaskType, // 任务类型
    file_id: string, // 航线文件id
    file_name: string, // 航线名称
    wayline_type: WaylineType, // 航线类型
    dock_sn: string,
    dock_name: string,
    workspace_id: string,
    username: string,
    begin_time: string,
    end_time: string,
    execute_time: string,
    completed_time: string,
    status: TaskStatus, // 任务状态
    progress: number, // 执行进度
    code: number, // 错误码
    rth_altitude: number // 相对机场返航高度 20 - 500
    out_of_control_action: OutOfControlAction // 失控动作
    media_count: number // 媒体数量
    uploading: boolean // 是否正在上传媒体
    uploaded_count: number // 已上传媒体数量
}

// Get Wayline Jobs
export const getWaylineJobs = async function (workspaceId: string, page: IPage): Promise<IListWorkspaceResponse<Task>> {
    const url = `${HTTP_PREFIX}/workspaces/${workspaceId}/jobs?page=${page.page}&page_size=${page.page_size}`
    const result = await request.get(url)
    return result.data
}

export interface DeleteTaskParams {
    job_id: string
}

//  删除机场任务
export async function deleteTask(workspaceId: string, params: DeleteTaskParams): Promise<IWorkspaceResponse<{}>> {
    const url = `${HTTP_PREFIX}/workspaces/${workspaceId}/jobs`
    const result = await request.delete(url, {
        params: params
    })
    return result.data
}

export enum UpdateTaskStatus {
    Suspend = 0, // 暂停
    Resume = 1, // 恢复
}

export interface UpdateTaskStatusBody {
    job_id: string
    status: UpdateTaskStatus
}

// 更新机场任务状态
export async function updateTaskStatus(workspaceId: string, body: UpdateTaskStatusBody): Promise<IWorkspaceResponse<{}>> {
    const url = `${HTTP_PREFIX}/workspaces/${workspaceId}/jobs/${body.job_id}`
    const result = await request.put(url, {
        status: body.status
    })
    return result.data
}

// Upload Wayline file
export const importKmzFile = async function (workspaceId: string, file: {}): Promise<IWorkspaceResponse<any>> {
    const url = `${HTTP_PREFIX}/workspaces/${workspaceId}/waylines/file/upload`
    const result = await request.post(url, file, {
        headers: {
            'Content-Type': 'multipart/form-data',
        }
    })
    return result.data
}

// 媒体立即上传
export const uploadMediaFileNow = async function (workspaceId: string, jobId: string): Promise<IWorkspaceResponse<{}>> {
    const url = `${HTTP_PREFIX}/workspaces/${workspaceId}/jobs/${jobId}/media-highest`
    const result = await request.post(url)
    return result.data
}
